/**
 * 给定N个点的数组A，要求构造一个树，每个点的度数是di，使得
 * SIGMA{Ai * di^2}
 * 最小
 * 本质上就是一个整数最优化的问题，令 xi = di
 * 令 f(X) = SIGMA{Ai * xi^2}
 * argmin f(X), s.t. SIGMA{xi} == 2N - 2
 * 由于f(X)是凸函数，因此局部最小值就是全局最小值，因此可以直接搜索
 * f(X)是加权范数，范数与最大值、放射函数等都是凸函数。
 * f(x)是凸函数等价于 f(tx+(1-t)y) <= tf(x) + (1-t)f(y) 0<=t<=1
 * 移项并且代入每一个分量，原不等式等价于
 *        0 <= SIGMA{t(1-t)(xi-yi)^2}
 * 所以原不等式成立当且仅当0==t||1==t||X==Y时
 * 所以f是凸函数，所以只需要保证每一步都比上一步更优，到最后必然是全局最优。
 * 
 * 实现的时候可以反过来考虑，首先必然每个点都有一的度数。然后再把剩余的N-2分配到每一个点上
 * 对与当前的(Ai,di)而言，度数加一的贡献是AI*(2di+1)
 * 我们需要每一次最小化这个贡献即可。因为局部最佳就是全局最佳。
 * 使用优先级队列即可。 
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;
using Real = long double;

struct _t{
    llt ai;
    int di;
    int idx;
    bool operator < (const _t & r) const {
        llt u = ai * (di + di + 1LL);
        llt v = r.ai * (r.di + r.di + 1LL);
        if(u != v) return u < v;
        return idx < r.idx;
    }
    bool operator > (const _t & r) const {
        return not this->operator<(r);
    }
};

int N;
vll A;
vi D;

priority_queue<_t, vector<_t>, greater<_t>> Queue;

llt proc(){
    D.assign(N + 1, 0);
    llt ans = 0;
    for(int i=1;i<=N;++i){
        ans += A[i];
        Queue.push({A[i], 1, i});
        D[i] = 1;
    }

    for(int i=0;i<N-2;++i){
        _t h;
        while(1){
            h = Queue.top(); Queue.pop();
            if(h.di == D[h.idx]) break;
        }        
        ans += h.ai * (h.di + h.di + 1);
        Queue.push({h.ai, D[h.idx] = h.di + 1, h.idx});
    }
#ifndef ONLINE_JUDGE
    for(int i=1;i<=N;++i){
        cout << i << ": " << D[i] << endl;
    }
#endif
    return ans;
}

void work(){ 
    cin >> N;
    A.assign(N + 1, 0);
    for(int i=1;i<=N;++i) cin >> A[i];
    cout << proc() << endl;
    return;
}




int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}